[小ネタ] Terraform で Knowledge bases のデータソース作成時に初回同期をかける

[小ネタ] Terraform で Knowledge bases のデータソース作成時に初回同期をかける

Clock Icon2024.12.25

こんにちは!AWS 事業本部コンサルティング部のたかくに(@takakuni_)です。

Terraform で Amazon Bedrock Knowledge bases を作成する時、aws_bedrockagent_data_source を利用すると思うのですが、初回の同期は Terraform でサポートされていません。(CloudFormation もサポートされていないようでした。)

そのため、以下のように手動で同期ボタンをクリックするわけですが、

2024-12-25 at 13.18.39-Knowledge Base  AmazonBedrock  us-west-2.png

何度、同期ボタンを押し忘れ、Sorry, I am unable to assist you with this request. と怒られたことでしょうか。由々しき事態です。

(app-py3.12) takakuni.shinnosuke@HL01556 app % python main.py 桃太郎ってどこ中?
Sorry, I am unable to assist you with this request.

そこで今回は Terraform の local-exec を使って初回のデータソースを同期をしてみたいと思います。

最終的なコードは以下に格納されています。

https://github.com/takakuni-classmethod/genai-blog/tree/main/knowledge_bases_initial_sync

terraform_data

terraform_data のリソースは以下になりました。(結局シェル芸でしたね。)

StartIngestionJob API と GetIngestionJob API の 2 種類を利用しました。

oregon(抜粋).tf
resource "terraform_data" "datasource_sync" {
  triggers_replace = [
    aws_bedrockagent_data_source.oregon
  ]

  provisioner "local-exec" {
    command = <<EOT
INGESTION_JOB_ID=$(aws bedrock-agent start-ingestion-job --region ${local.oregon} \
--data-source-id ${aws_bedrockagent_data_source.oregon.data_source_id} \
--knowledge-base-id ${aws_bedrockagent_knowledge_base.oregon.id} \
--query ingestionJob.ingestionJobId --output text)

while true; do
  export STATUS=$(aws bedrock-agent get-ingestion-job \
  --region ${local.oregon} \
  --knowledge-base-id ${aws_bedrockagent_knowledge_base.oregon.id} \
  --data-source-id ${aws_bedrockagent_data_source.oregon.data_source_id} \
  --ingestion-job-id $INGESTION_JOB_ID \
  --query ingestionJob.status \
  --output text)
  if [ "$STATUS" = "COMPLETE" ]; then
    echo "Ingestion job is complete."
    break
  elif [ "$STATUS" = "FAILED" ]; then
    echo "Ingestion job failed."
    exit 1
  fi
  sleep 10
done
EOT
  }
}

工夫した点

StartIngestionJob のみを利用する場合、ジョブの実行結果を拾えないため GetIngestionJob も加えてみました。(一方通行でよければ StartIngestionJob のみで良いと思います。)

EventBridge Scheduler も StartIngestionJob のみの一方通行になるため、ステータスを確認したい場合は Step Functions を噛ませてあげるのが吉かと思います。

https://qiita.com/sugimount-a/items/8a1ccf777c5ff11dcddc

もっと工夫するなら

GetIngestionJob の Status は以下のどれかになるようです。必要に応じて分岐させるのも良いですね。

Valid Values: STARTING | IN_PROGRESS | COMPLETE | FAILED | STOPPING | STOPPED

https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_GetIngestionJob.html#API_agent_GetIngestionJob_ResponseSyntax

結果を確認

無事同期できていますね。

2024-12-25 at 21.09.59-Amazon Bedrock  us-west-2@2x.png

ナレッジベースからも回答が返ってきています。めでたしめでたし。

(app-py3.12) takakuni@ app % python main.py 桃太郎ってどこ中?
桃太郎は日本の伝統的な昔話の主人公で、最初は桃の中から生まれた元気な子供として登場します。成長するにつれて、日本中で最も強い人物となり、鬼が島征伐を目指して旅に出ます。 彼は旅の途中で、犬を仲間にし、きびだんごを分け与えて一緒に鬼が島へ向かいます。桃太郎は非常に力が強く、近所の村中で誰も敵わないほどの力を持っていましたが、同時に優しい性格で、両親によく孝行をする子供でした。

まとめ

以上、「Terraform で Knowledge bases のデータソース作成時に初回同期をかける」でした。

初回同期を忘れないための非常に細かな tips ですが、参考になれば幸いです。

AWS 事業本部コンサルティング部のたかくに(@takakuni_)でした!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.